package com.lft.juc08.blockingqueue;

import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;

/**
 * 同步队列
 * 和其他的 BlockingQueue 不一样，SynchronousQueue 不存储元素。
 * put 了一个元素，必须从里面先 take 取出来。否则不能在 put 进去值！
 */
public class TestSynchronousQueue {
	public static void main(String[] args) {
		// 同步队列
		SynchronousQueue<String> synchronousQueue = new SynchronousQueue<>();
		// 存线程
		new Thread(() -> {
			try {
				System.out.println(Thread.currentThread().getName() + " Put 1");
				synchronousQueue.put("1");
				System.out.println(Thread.currentThread().getName() + " Put 2");
				synchronousQueue.put("2");
				System.out.println(Thread.currentThread().getName() + " Put 3");
				synchronousQueue.put("3");
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}, "T1").start();
		// 取线程
		new Thread(() -> {
			try {
				TimeUnit.SECONDS.sleep(3);
				System.out.println(Thread.currentThread().getName() + " Get " + synchronousQueue.take());
				TimeUnit.SECONDS.sleep(3);
				System.out.println(Thread.currentThread().getName() + " Get " + synchronousQueue.take());
				TimeUnit.SECONDS.sleep(3);
				System.out.println(Thread.currentThread().getName() + " Get " + synchronousQueue.take());
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
		}, "T2").start();
		
	}
}
